#include "RingQueue.hpp"
#include <pthread.h>
#include <ctime>
#include <sys/types.h>
#include <unistd.h>
#include "Task.hpp"

void* ProductorRoutine(void* args)
{
    RingQueue<Task>* p_ringqueue = static_cast<RingQueue<Task> *>(args); 
    while(true)
    {
        //version1  简单数据
        // int data = rand() % 10 + 1 ;
        // p_ringqueue->push(data);
        // std::cout << "生产成功，生产的资源为：" << data << std::endl; 

        //version2  任务
        sleep(1);
        int x = rand() % 100 + 1;
        int y = rand() % 5 ;
        char op = oper[rand() % oper.size()];
        Task t(x , y , op , mymath);
        p_ringqueue->push(t);
        std::cout << "生产任务完成：" << t.toString() << std::endl;
    }
}

void* ConsumerRoutine(void* args)
{
    RingQueue<Task>* p_ringqueue = static_cast<RingQueue<Task> *>(args);
    while(true)
    {
        //version1  简单数据
        // int data;
        // p_ringqueue->pop(&data);
        // std::cout << "消耗成功，消耗的资源为：" << data << std::endl;    
        // sleep(1);

        //version2  任务
        Task t;
        p_ringqueue->pop(&t);
        std::cout << "计算任务完成：" << t() << std::endl;

    }

}


int main()
{
    srand((unsigned int)time(nullptr) ^ getpid() ^ pthread_self() ^ 0x12345678);//后面的只是为了让随机数更加的随机
    RingQueue<Task> *rq = new RingQueue<Task>();
    // 单生产 单消耗  ---->多生产 多消耗（两把锁，分别锁生产和消耗，保证生产和消耗在同一时间只能一个运行）
    pthread_t p[4],c[8];
    for(int i = 0 ;i < 4;i++)  pthread_create(p+i , nullptr , ProductorRoutine , rq);
    for(int i = 0 ;i < 8;i++)  pthread_create(c+i , nullptr , ConsumerRoutine , rq);

    for(int i = 0 ;i < 4;i++)  pthread_join(p[i] , nullptr);
    for(int i = 0 ;i < 8;i++)   pthread_join(c[i] , nullptr);

    delete rq;
    return 0;
}